/*******************************************************************************
 * Copyright 2011 @ Kapil Viren Ahuja
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package com.kapil.framework.lang;

import java.lang.reflect.Method;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.ReflectionUtils;

/**
 * Provides utility methods for Reflection.
 *
 */
@SuppressWarnings("rawtypes")
public final class ReflectionUtil
{
    private ReflectionUtil()
    {
    }


    public static Method findSetter(Class clazz, String methodName)
    {
        String setter = convertNameToSetter(methodName);

        Method propertyGetterMethod = findGetter(clazz, methodName);

        Class[] classes = new Class[1];
        classes[0] = propertyGetterMethod.getReturnType();

        return ReflectionUtils.findMethod(clazz, setter, classes);
    }

    public static Method findGetter(Class clazz, String methodName)
    {
        String getter = convertNameToGetter(methodName);
        return ReflectionUtils.findMethod(clazz, getter);
    }



    public static Method findGetterWithStringParam(Class clazz, String methodName)
    {
        String getter = convertNameToGetter(methodName);
        Class[] classes = new Class[1];
        classes[0] = String.class;

        return ReflectionUtils.findMethod(clazz, getter, classes);
    }

    public static Method findGetterWithIntegerParam(Class clazz, String methodName)
    {
        String getter = convertNameToGetter(methodName);
        Class[] classes = new Class[1];
        classes[0] = Integer.class;

        return ReflectionUtils.findMethod(clazz, getter, classes);
    }

    public static Method findAdder(Class clazz, String methodName)
    {
        String adder = convertNameToSetter(methodName);

        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods)
        {
            if (method.getName().equals(adder))
            {
                return method;
            }
        }

        return null;
    }


    public static String convertNameToSetter(String methodName)
    {
        return "set" + StringUtils.capitalize(methodName);
    }

    public static String convertNameToAdder(String methodName)
    {
        return "add" + StringUtils.capitalize(methodName);
    }

    public static String convertNameToGetter(String methodName)
    {
        return "get" + StringUtils.capitalize(methodName);
    }
}
